﻿#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>

void* myMemcpy(void* dst, void* src, size_t num)
{
	void* ret = dst;
	while (num--)
	{
		//为什么要转换为char* ？因为void*指针不能直接解引用
		//而char类型就是一个字节，可以做到按字节拷贝
		*((char*)dst) = *((char*)src);
		dst = (char*)dst + 1;
		src = (char*)src + 1;
	}
	return ret;
}

void* myMemmove(void* dst, const void* src, size_t num)
{
	void* ret = dst;
	//检查是否有重叠,重叠也分为src在dst前后的情况
	//就算是有重叠的情况下，若dst在src之前，使用memcpy也没影响
	//也就是说只有在重叠且dst在src后的情况才需要重写
	if (src < dst && (char*)src + num > (char*)dst)
	{
		//逆序拷贝即可
		while (num--)
		{
			*((char*)dst + num) = *((char*)src + num);
		}
	}
	else
	{
		ret = myMemcpy(dst, src, num);
	}
	return ret;
}

int check_system()
{
	int i = 1;
	int* p = &i;
	return (int)(*(char*)p);
	//小端：01 00 00 00 char类型一个字节，取01
	//大端：00 00 00 01 char类型一个字节，取00
}

union Un1
{
	char c[5];
	int i;
};
union Un2
{
	short c[7];
	int i;
};
int main()
{
	//下⾯输出的结果是什么？
	printf("%d\n", sizeof(union Un1));
	printf("%d\n", sizeof(union Un2));
	return 0;
}